/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package AccesoDatos.Persistencia.Manager;

import AccesoDatos.Persistencia.Entidad.EPalabra;
import LogicaNegocio.Biblioteca.PalabraClave;
import MainBiblioSoft.BiblioSoft;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;

/**
 * Esta clase en java es el gestor de persistencia
 * de objetos Palabra en la base de datos BiblioSoft.
 *
 * @author sebaxtian
 * Archivo: ManagerPalabra.java
 * @version 1.0
 * Fecha: lun may  3 00:35:27 COT 2010
 */


public class ManagerPalabra {

    @PersistenceUnit
    private EntityManagerFactory managerFactory;
    private EntityManager entityManager;

    /**
     * Metodo constructor, crea un gestor para la persistencia de Palabra
     * 
     */
    public ManagerPalabra() {
        managerFactory = BiblioSoft.managerFactory;
        entityManager = managerFactory.createEntityManager();
    }

    /**
     * Metodo encargado de la persistencia en la entidad Palabra
     * de un objeto PalabraClave
     *
     * @param palabra
     */
    public void crearPalabra(PalabraClave palabra) {
        entityManager.clear();
        EPalabra entidadPalabra = new EPalabra();
        entidadPalabra.setNombre(palabra.getNombre());
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entityManager.persist(entidadPalabra);
        transaccion.commit();
        entityManager.clear();
    }

    /**
     * Este metodo actualiza la palabra clave.
     *
     * @param idPalabra
     * @param palabra
     */
    public void actualizarPalabra(int idPalabra, PalabraClave palabra) {
        entityManager.clear();
        EPalabra entidadPalabra;
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entidadPalabra = entityManager.find(EPalabra.class, idPalabra);
        transaccion.commit();
        if(entidadPalabra != null){
            entidadPalabra.setNombre(palabra.getNombre());
            transaccion.begin();
            entityManager.merge(entidadPalabra);
            transaccion.commit();
        }
        entityManager.clear();
    }

    /**
     * Obtiene la palabra clave.
     * retorna null si no existe.
     *
     * @param idPalabra
     * @return palabra
     */
    public PalabraClave obtenerPalabra(int idPalabra) {
        entityManager.clear();
        EPalabra entidadPalabra;
        PalabraClave palabra = null;
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entidadPalabra = entityManager.find(EPalabra.class, idPalabra);
        transaccion.commit();
        if(entidadPalabra != null){
            palabra = new PalabraClave();
            palabra.setIdPalabra(entidadPalabra.getIdpalabra());
            palabra.setNombre(entidadPalabra.getNombre());
        }
        entityManager.clear();
        return palabra;
    }

    /**
     * Busca si existe una palabra con nombre identificado en el argumento,
     * retorna la palabra si existe, de lo contrario retorna null
     * 
     * @param palabra
     * @return palabraClave
     */
    public PalabraClave buscarPalabra(String palabra) {
        entityManager.clear();
        EPalabra entidadPalabra;
        PalabraClave palabraClave = null;
        Query consulta = entityManager.createNamedQuery("EPalabra.findByNombre");
        consulta.setParameter("nombre", palabra);
        if(!consulta.getResultList().isEmpty()){
            entidadPalabra = (EPalabra)consulta.getResultList().get(0);
            palabraClave = new PalabraClave(entidadPalabra.getIdpalabra(), entidadPalabra.getNombre());
        }
        entityManager.clear();
        return palabraClave;
    }
}
